#include <my_header.h>
// 尝试使用2个线程对同一个全局变量各加2000万(或者
// 更多次)，统计加锁解锁的消耗。
// 使用gettimeofday可以获取高精度当前时间
/* Usage:  ./4_gettimeofday*/
#define  MAX 20000000
int num= 0;
// 或者可以把锁定义成全局 pthread_mutex_t lock;
void *threadFunc1(void *arg)
{   // 子线程入口函数
    pthread_mutex_t *pmLock = (pthread_mutex_t *)arg;
     for(int i = 0; i<MAX; i++)
    {
        pthread_mutex_lock(pmLock);
        num++;
        pthread_mutex_unlock(pmLock);
    }
    printf("child thread stop\n");
    return NULL;
}
int main(void){ // main函数 入口函数
    // 定义锁
    pthread_mutex_t mLock;
    // 初始化锁
    pthread_mutex_init(&mLock, NULL);

    // 获取时间
    struct timeval beginTime, endTime;
    gettimeofday(&beginTime, NULL);


    pthread_t tid;
    int ret  = pthread_create(&tid, NULL, threadFunc1, &mLock);
    THREAD_ERROR_CHECK(ret, "pthread_create");
    // 累加2000万
    printf("main thread is running\n");
    for(int i = 0; i<MAX; i++)
    {
        pthread_mutex_lock(&mLock);
        num++;
        pthread_mutex_unlock(&mLock);
    }
    // 捕获子线程的id
    pthread_join(tid, NULL);
    // 打印输出的值
    printf("num :%d\n", num);

    // 结束时间
    gettimeofday(&endTime, NULL);
    printf("time:%ld us\n", endTime.tv_usec - beginTime.tv_usec + (endTime.tv_sec - endTime.tv_sec) * 100000);
    // 销毁锁
    pthread_mutex_destroy(&mLock);
    return 0;
}


